#include "widget.h"
#include "ui_widget.h"
#include <QLineEdit>
#include <QDebug>
#include <QRegExpValidator>

void QLineEditEnterPersonalInformation(Ui::Widget* ui, Widget* Pthis){
    (void)Pthis;
    //设置当lineEdit为空时显示的文本是请输入姓名
    ui->lineEdit->setPlaceholderText("请输入姓名");
    //设置有一个清除按钮
    ui->lineEdit->setClearButtonEnabled(true);

    ui->lineEdit_2->setPlaceholderText("请输入密码");
    ui->lineEdit_2->setClearButtonEnabled(true);
    //设置显示模式为密码
    //QLineEdit::Normal ：这是默认值，文本框会显示输入的文本
    //QLineEdit::NoEcho ：在这种模式下，文本框不会显示任何输入的字符
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);

    ui->lineEdit_3->setPlaceholderText("请输入手机号码");
    ui->lineEdit_3->setClearButtonEnabled(true);
    //可以进行一些简单的表单验证
    ui->lineEdit_3->setInputMask("000-0000-0000");
}

void QLineEditFormValidation(Ui::Widget* ui, Widget* Pthis) {
    (void)Pthis;
    //inputMask 只能进行简单的输入格式校验
    //实际开发中, 基于正则表达式的方式是更核心的方法
    // 给单行输入框设置验证器。基于正则表达式来完成验证的
    //使用 QRegExp 创建一个正则表达式对象
    QRegExp regExp("^1\\d{10}$");

    //使用 QRegExpValidator 创建一个验证器对象
    ui->lineEdit_4->setValidator(new QRegExpValidator(regExp));

    ui->pushButton_2->setEnabled(false);
}

void QLineEditPasswordValidation(Ui::Widget* ui, Widget* Pthis) {
    ui->lineEdit_5->setEchoMode(QLineEdit::Password);
    ui->lineEdit_5->setPlaceholderText("请输入密码");
    ui->lineEdit_5->setClearButtonEnabled(true);

    ui->lineEdit_6->setEchoMode(QLineEdit::Password);
    ui->lineEdit_6->setPlaceholderText("请再次输入密码");
    ui->lineEdit_6->setClearButtonEnabled(true);

    ui->pushButton_3->setEnabled(false);

    (void)Pthis;
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QLineEditEnterPersonalInformation(ui, this);
    QLineEditFormValidation(ui, this);
    QLineEditPasswordValidation(ui, this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::compare()
{
    const QString& s1 = ui->lineEdit_5->text();
    const QString& s2 = ui->lineEdit_6->text();

    if (s1 == s2) {
        ui->label_5->setText("两次输入的密码一致");
        ui->pushButton_3->setEnabled(true);
    }
    else {
        ui->label_5->setText("两次输入的密码不一致");
    }
}


void Widget::on_pushButton_clicked()
{
    QString gender = ui->radioButton->isChecked() ? "男" : "女";

    qDebug() << "姓名："<< ui->lineEdit->text()
             << "密码：" << ui->lineEdit_2->text()
             << "性别：" << gender
             << "电话：" << ui->lineEdit_3->text();

}

//当QLineEdit中的文本改变时，发出此信号，text是新的文本。代码对文本的修改不能触发这个信号
void Widget::on_lineEdit_4_textEdited(const QString &arg1)
{
    //槽函数有const,而validate函数不能接收const,所以需要构建一个新的对象
    QString content = arg1;
    int pos = 0;
    //通过获取到验证器对象,然后调取验证规则对content进行验证,后面这个是验证成功的意思
    //程序员可以自定义一个Validator，重写validate函数.刚才用的RegExpValidator是Qt内置的
    if (ui->lineEdit_4->validator()->validate(content, pos) == QValidator::Acceptable) {
        //验证通过
        ui->pushButton_2->setEnabled(true);
    }
    else {
       //验证未通过
        ui->pushButton_2->setEnabled(false);
    }
}

void Widget::on_lineEdit_5_textEdited(const QString &arg1)
{
    (void)arg1;
    this->compare();
}

void Widget::on_lineEdit_6_textEdited(const QString &arg1)
{
    (void)arg1;
    this->compare();
}

//显示和隐藏密码
void Widget::on_checkBox_toggled(bool checked)
{
    if (checked){
        ui->lineEdit_5->setEchoMode(QLineEdit::Normal);
        ui->lineEdit_6->setEchoMode(QLineEdit::Normal);
    }
    else {
        ui->lineEdit_5->setEchoMode(QLineEdit::Password);
        ui->lineEdit_6->setEchoMode(QLineEdit::Password);
    }
}
